package com.file.system.tools.page;

import org.apache.commons.collections.map.HashedMap;

import java.util.Map;

/**
 * 分页工具
 *
 * @author jch
 * @date
 */
public class DP {
    private static final String pidName = "p";//当前页数键名
    private static final String pageSizeName = "pageSize";//每页显示条数键名
    private static final String pagingName = "paging";//返回页面键名
    private static final String pageIndexName = "page";//当前页
    private static final Integer defaultPageIndex = 1;//默认页码
    private static final Integer defaultPageSize = 10;//默认每页显示条数

    private static final String pageIndex = "pageIndex";//当前页数键名oracle


    //获取当前页
    public int pid;
    //每页显示条数
    public int pageSize;
    //总数
    public int count;
    //总页数
    public int maxpage;
    //上一页
    public int prepage;
    //下一页
    public int nextpage;
    //mysql起始数量
    public int mysqlStartNumber;


    /**
     * 初始化分页工具
     *
     * @date
     */
    public DP() {

    }


    /**
     * 初始化分页工具
     *
     * @date
     */
    public DP(Map<String, String> map, int count) {
        // 未获取页码时设置当前页为默认页码，否则页码为传递参数
        this.pid = Integer.parseInt(map.getOrDefault(pidName, defaultPageIndex.toString()));
        // 未获取每页条数时设置为默认条数，否则条数为传递参数
        this.pageSize = Integer.parseInt(map.getOrDefault(pageSizeName, defaultPageSize.toString()));
        // 通过总页数计算页码
        calculationPaging(count);
    }

    /**
     * 初始化分页工具
     *
     * @date
     */
    public DP(int p, int pageSize, int count) {
        // 未获取页码时设置当前页为默认页码，否则页码为传递参数
        this.pid = p == 0 ? defaultPageIndex : p;
        // 未获取每页条数时设置为默认条数，否则条数为传递参数
        this.pageSize = pageSize == 0 ? defaultPageSize : pageSize;
        // 通过总页数计算页码
        calculationPaging(count);
    }


    /**
     * 创建分页
     */
    public static DP init() {
        DP dp = new DP();
        return dp;
    }

    /**
     * 分页
     */
    public DP paging(int p, int pageSize, int count) {
        // 未获取页码时设置当前页为默认页码，否则页码为传递参数
        this.pid = p == 0 ? defaultPageIndex : p;
        // 未获取每页条数时设置为默认条数，否则条数为传递参数
        this.pageSize = pageSize == 0 ? defaultPageSize : pageSize;
        // 通过总页数计算页码
        calculationPaging(count);
        return this;
    }

    /**
     * 分页
     */
    public DP pagingFreemark(int pageSize, int count) {
        // 未获取页码时设置当前页为默认页码，否则页码为传递参数
        this.pid = 1;
        // 未获取每页条数时设置为默认条数，否则条数为传递参数
        this.pageSize = pageSize == 0 ? defaultPageSize : pageSize;
        // 通过总页数计算页码
        calculationPaging(count);
        return this;
    }


    /**
     * 通过总页数计算页码
     *
     * @date
     */
    private void calculationPaging(int count) {
        // 总条数
        this.count = count;
        // 最大页数
        this.maxpage = (int) Math.ceil((double) count / this.pageSize);
        // 检查当前页是否大于最大页数
        this.pid = Math.min(this.pid, this.maxpage);
        // 检查当前页是否小于第一页
        this.pid = Math.max(this.pid, 1);
        // 上一页
        this.prepage = Math.max(this.pid - 1, 1);
        // 下一页
        this.nextpage = Math.min(this.pid + 1, this.maxpage);
        // mysql起始数量
        this.mysqlStartNumber = (this.pid - 1) * this.pageSize;
    }


    /**
     * 返回分页map
     *
     * @date
     */
    public Map<String, Object> getMysqlPagingParamMap() {
        Map<String, Object> map = new HashedMap();
        //设置起始数量
        map.put(this.pageIndex, this.mysqlStartNumber);
        //设置每页条数
        map.put(this.pageSizeName, this.pageSize);
        //设置每页条数
        map.put(this.pageIndexName, this.pid);
        return map;
    }

    public Map<String, Object> getOraclePagingParamMap() {
        Map<String, Object> map = new HashedMap();
        //设置起始数量
        map.put(this.pageIndex, this.pid);
        //设置每页条数
        map.put(this.pageSizeName, this.pageSize);
        return map;
    }

    /**
     * 返回当前页码
     *
     * @date
     */
    public int getPid() {
        return pid;
    }

    /**
     * 返回每页条数
     *
     * @date
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 返回总数
     *
     * @date
     */
    public int getCount() {
        return count;
    }

    /**
     * 返回最大页数
     *
     * @date
     */
    public int getMaxpage() {
        return maxpage;
    }

    /**
     * 返回上一页页码
     *
     * @date
     */
    public int getPrepage() {
        return prepage;
    }

    /**
     * 返回下一页页码
     *
     * @date
     */
    public int getNextpage() {
        return nextpage;
    }

    /**
     * 页面返回键名
     *
     * @date
     */
    public static String getPagingName() {
        return pagingName;
    }

    /**
     * 返回页码键名
     *
     * @date
     */
    public static String getPidName() {
        return pidName;
    }

    /**
     * 返回条数键名
     *
     * @date
     */
    public static String getPageSizeName() {
        return pageSizeName;
    }

}
